package Json;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

/**
 * json 转换为 Map
 * 
 * gson转换时指定Integer问题
 * 
 * @author zybw-kf01
 *
 */
public class JsonMapConvert {
	public static void main(String[] args) {
		String jsonString = "{\"1\":\"怪盗kidou\",\"name\":\"怪盗kidou\",\"age\":24,\"emailAddress\":\"ikidou@example.com111\"}\n";
		String jsonInteger = "{\"1\":\"怪盗kidou\"}";

		Gson gson = new Gson();

		HashMap map = gson.fromJson(jsonString, HashMap.class);
		HashMap<String, Object> jsonMap = (HashMap<String, Object>) map;

		for (HashMap.Entry<String, Object> entry : jsonMap.entrySet()) {
			System.out.println("key== " + entry.getKey() + "  value== " + entry.getValue());
		}

		strToIntegerMap(jsonInteger, gson, jsonMap);

	}

	
	private static void strToIntegerMap(String jsonInteger, Gson gson, HashMap<String, Object> jsonMap) {
		HashMap mapInt = gson.fromJson(jsonInteger, HashMap.class);
		HashMap<Integer, Object> jsonMapInteger = (HashMap<Integer, Object>) mapInt;
		System.err.println("1== " + jsonMap.get(1));
		System.err.println("1str== " + jsonMap.get(String.valueOf(1)));

		/**
		 *   这就显得很尴尬了，明明为Map指定了Integer类型，却变成了String类型，
		 *   难道Gson默认这样不厚道的转换了一下，诚然，我最初的确这么想的，但随后就否决了，google不至于这么菜吧。
		 *   细细一想，其实我们根本就没告诉Gson我们HashMap中key的类型，
		 *   最后仅仅是将Gson转换成功的Map赋值给我们声明的Map，So如下转换就OK了。
		 */
		System.out.println("===通过reflect告知Gson Map键值对的类型===");
		java.lang.reflect.Type type = new TypeToken<HashMap<Integer, String>>() {}.getType();
		
	
		Map<Integer, String> map2 = gson.fromJson(jsonInteger, type);
		System.out.println("Integer(\"1\")== "+map2.get(new Integer("1"))); // 输出 "大厅"
		System.out.println("(\"1\")=="+map2.get("1")); // 输出 null
	}
}
